home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / portfoli / bootst11.lzh / PF BOOTSTRAP VATIPX PLIBACUSMC < prev    next >
Text File  |  1989-05-28  |  7KB  |  328 lines

  1. /*
  2.  * Dialer support for Hayes Smartmodem(tm) 2400 modem.
  3.  */
  4.  
  5. #ifndef lint
  6. static char *RCSid = "$Header: sm2400.c,v 1.11 86/06/24 19:47:12 rayan Exp $";
  7. #endif
  8.  
  9. #undef DEBUG 1
  10.  
  11. #ifdef    DEBUG
  12. int debug = 1;
  13. #define STATIC
  14. #else
  15. #define STATIC static
  16. #endif
  17.  
  18. #include "tip.h"
  19. #include <sys/time.h>
  20.  
  21.     /* commands */
  22. STATIC char    NAME[] =        "sm2400";
  23. STATIC char    WARMUP[] =        "\rat\r";
  24. STATIC char    RESULT_CODES[] =    "\ratq0\r";
  25. STATIC char    DONT_ANSWER[] =        "\rats0=0\r";
  26. STATIC char    IGN_ESCAPE[] =        "\rats2=128\r";
  27. STATIC char    CODES_4[] =        "\ratx4\r";
  28. STATIC char    DIAL_PREFIX[] =        "\ratdt";
  29.  
  30.     /* result codes */;
  31. STATIC char    MDM_OK[] =        "\r\nOK\r\n";
  32. STATIC char    RING[] =        "\r\nRING\r\n";
  33. STATIC char    NO_CARRIER[] =        "\r\nNO CARRIER\r\n";
  34. STATIC char    ERROR[] =        "\r\nERROR\r\n";
  35. STATIC char    CONNECT[] =        "\r\nCONNECT\r\n";
  36. STATIC char    CONNECT_600[] =        "\r\nCONNECT 0600\r\n";
  37. STATIC char    CONNECT_1200[] =    "\r\nCONNECT 1200\r\n";
  38. STATIC char    CONNECT_2400[] =    "\r\nCONNECT 2400\r\n";
  39. STATIC char    NO_DIALTONE[] =        "\r\nNO DIALTONE\r\n";
  40. STATIC char    NO_ANSWER[] =        "\r\nNO ANSWER\r\n";
  41. STATIC char    BUSY[] =        "\r\nBUSY\r\n";
  42.  
  43. STATIC char    *nosm24con[] =    {    BUSY,
  44.                     NO_DIALTONE,
  45.                     NO_ANSWER,
  46.                     ERROR,
  47.                     RING,
  48.                     NO_CARRIER,
  49.                     0
  50.                 };
  51.  
  52. /* The baudrate starts at 300, and doubles for next element of array */
  53. STATIC char    *sm24con[] =    {    CONNECT,
  54.                     CONNECT_600,
  55.                     CONNECT_1200,
  56.                     CONNECT_2400,
  57.                     0
  58.                 };
  59. #ifdef    USG
  60. STATIC struct termio termio;        /* needed on USG to set HUPCL */
  61. #endif    /* USG */
  62.  
  63. #define    CMD_DELAY    5    /* number of seconds to wait for response
  64.                     while in command mode */
  65. #define DIAL_DELAY    120    /* number of seconds to wait for response
  66.                     after sending dial string */
  67. #define    MAXSTR    100
  68.  
  69. static jmp_buf    jmpbuf;
  70.  
  71. int     sm24read(), sm24write();
  72.  
  73. sm24_dialer(num, acu)
  74. register char    *num;
  75. char    *acu;
  76. {
  77.     int    ret;
  78.     int    i, j;
  79.     char    buf1[MAXSTR], buf2[MAXSTR], buf3[MAXSTR];
  80. #ifdef ACULOG
  81.     char    line[MAXSTR];
  82. #endif
  83.  
  84.     /*
  85.      * wake up the modem if it's listening...
  86.      */
  87.     if (boolean(value(VERBOSE)))
  88.         printf("diddling dialer...");
  89.  
  90.     sleep(1);    /* Give modem time to settle down after reset */
  91.     if ((!sm24set(RESULT_CODES, buf1, num, "is naughty")
  92.              && !sm24set(RESULT_CODES, buf1, num, "not listening"))
  93.         || !sm24set(DONT_ANSWER, buf1, num, "auto-answer not turned off")
  94.         || !sm24set(IGN_ESCAPE, buf1, num, "escape code not turned off")
  95.         || !sm24set(CODES_4, buf1, num, "result codes not set"))
  96.         return 0;
  97.  
  98.     /* insurance ? */
  99. #ifdef    USG
  100.     if (ioctl(FD, TCGETA, &termio) < 0)
  101.         perror("tip: TCGETA ioctl");
  102.     termio.c_cflag |= HUPCL;
  103.     if (ioctl(FD, TCSETA, &termio) < 0)
  104.         perror("tip: TCSETA ioctl");
  105. #else    /* USG */
  106.     if (ioctl(FD, TIOCHPCL, 0) < 0)
  107.         perror("tip: TIOCHPCL ioctl");
  108. #endif    /* USG */
  109.  
  110.     buf2[0] = '\0';
  111.     for (i = 0, j = 300; sm24con[i] != (char *)0; i++, j*=2) {
  112.         if (BR == j) {
  113.             strcpy(buf2, sm24con[i]);
  114.             break;
  115.         }
  116.     }
  117.     if (buf2[0] == '\0') {
  118.         sprintf(buf2, "unsupported baud rate (%d)", BR);
  119.         goto error;
  120.     }
  121.  
  122.     /* Is it safe to just say ATD and let the options setting rule? */
  123.     sm24write(DIAL_PREFIX);
  124.     sm24write(num);
  125.     sm24write("\r");
  126.     if (boolean(value(VERBOSE)))
  127.         printf(" dialing... ");
  128.     if (ret = sm24read(buf1, DIAL_DELAY, (u_int) strlen(buf2)) == 0) {
  129.         strcpy(buf2, "TIMEOUT on dial");
  130.         goto error;
  131.     }
  132.     if (ret == -1) {
  133.         strcpy(buf2, "ioctl failed");
  134.         goto error;
  135.     }
  136.     if (strncmp(buf1, buf2, strlen(buf2)) != 0) {
  137.         for (i = 0, j = 300; sm24con[i] != (char *)0; i++, j *= 2) {
  138.             if (!strncmp(buf1, sm24con[i], strlen(sm24con[i]))) {
  139.                 /* This should never fail */
  140.                 if ((i = speed(j)) != NULL) {
  141.                     BR = j;
  142.                     ttysetup(i);
  143.                 } else {
  144.                     printf("speed(%d) failed\n", j);
  145.                     return 0;
  146.                 }
  147.                 goto ok;
  148.             }
  149.         }
  150.         for (i = 0; nosm24con[i] != (char *)0; i++) {
  151.             if (!strncmp(buf1, nosm24con[i], strlen(nosm24con[i]))){
  152.                 char    *bp, *cp;
  153.                 for (bp = buf2, cp = nosm24con[i]; *cp; cp++) {
  154.                     if (*cp != '\r' && *cp != '\n')
  155.                         *bp++ = *cp;
  156.                 }
  157.                 *bp = '\0';
  158.                 goto error;
  159.             }
  160.         }
  161.         (void) strcpy(buf2, "UNKNOWN ERROR");
  162. error:
  163.         printf("dial failed (%s)\n", buf2);
  164.         sprintf(buf3, "dial failed (%s)", buf2);
  165. #ifdef ACULOG
  166.         logent(value(HOST), num, NAME, buf3);
  167. #endif
  168.         return 0;
  169.     }
  170. ok:
  171.     if (boolean(value(VERBOSE)))
  172.         printf("(%d baud) ", BR);
  173.     i = 2;
  174. #ifdef    USG
  175.     if (ioctl(FD, TCFLSH, i) < 0)
  176.         perror("tip: TCFLSH ioctl");
  177. #else    /* USG */
  178.     if (ioctl(FD, TIOCFLUSH, &i) < 0)
  179.         perror("tip: TIOCFLUSH ioctl");
  180. #endif    /* USG */
  181.     return 1;
  182. }
  183.  
  184.  
  185. sm24_disconnect()
  186. {
  187. #ifdef    USG
  188.     if (ioctl(FD, TCGETA, &termio) < 0)
  189.         perror("tip: TCGETA ioctl");
  190.     termio.c_cflag &= (CBAUD & B0);
  191.     if (ioctl(FD, TCSETA, &termio) < 0)
  192.         perror("tip: TCSETA ioctl");
  193.     sleep(2);
  194. #endif    /* USG */
  195.     (void) close(FD);
  196. }
  197.  
  198.  
  199. sm24_abort()
  200. {
  201.     sm24_disconnect();
  202. }
  203.  
  204. STATIC
  205. sm24write(cp)
  206. register char    *cp;
  207. {
  208.     struct timeval t;
  209.  
  210.     for (; *cp != '\0' ; cp++) {
  211.         if (write(FD, cp, 1) != 1) {
  212.             perror("tip: sm24write: write error");
  213.             return;
  214.         }
  215. #ifdef    DEBUG
  216.         if (debug) {
  217.             fprintf(stderr, "written '%c'\n", *cp);
  218.         }
  219. #endif
  220.         t.tv_sec = 0;
  221.         t.tv_usec = (10 * 1000000)/BR;
  222.         (void) select(32, 0, 0, 0, &t);
  223.     }
  224. }
  225.  
  226. STATIC
  227. sm24read(buf, timeout, max)
  228. register char    *buf;
  229. unsigned int timeout, max;
  230. {
  231.     int    alarmtr();
  232.     struct timeval t;
  233.     register char    *rp;
  234.     unsigned int numread, numprev = 0, numpndg = 0;
  235.     unsigned int toread;
  236.  
  237. #ifdef    DEBUG
  238.     if (debug)
  239.         fprintf(stderr, "\n---------\nentering sm24read(): timeout is: %d, max is: %d\n", timeout, max);
  240. #endif
  241.     rp = buf;
  242.     *rp = '\0';
  243.     (void) signal(SIGALRM, alarmtr);
  244.     if (setjmp(jmpbuf)) {
  245.         *rp = '\0';
  246.         return 0;
  247.     }
  248.     (void) alarm(timeout);
  249.         /* wait till modem says something or until timeout */
  250.     while (numpndg == 0 || numpndg != numprev) {
  251.         numprev = numpndg;
  252.         if (ioctl(FD, FIONREAD, &numpndg) == -1) {
  253.             perror("tip: FIONREAD ioctl");
  254.             return -1;
  255.         }
  256.         t.tv_sec = 0;
  257.         t.tv_usec = (5 * 10 * 1000000)/BR;
  258.         (void) select(32, 0, 0, 0, &t);
  259.     }
  260.     (void) alarm(0);
  261. #ifdef    DEBUG
  262.     if (debug)
  263.         fprintf(stderr, "number of chars waiting is: %d\n", numpndg);
  264. #endif
  265.     toread = ((numpndg > max) ? max : numpndg);
  266.       if ((numread = read(FD, rp, toread)) < toread)
  267.         perror("read error");
  268. #ifdef    DEBUG
  269.     if (debug) {
  270.         int i; char *p;
  271.         fprintf(stderr, "read %d chars:", numread);
  272.         for (i=0, p=rp; i<numread; i++, p++)
  273.             fprintf(stderr, "%0.2x ", *p);
  274.         fprintf(stderr, "\n");
  275.         fflush(stderr);
  276.     }
  277. #endif
  278.     rp += numread;
  279.     *rp = '\0';
  280. #ifdef    DEBUG
  281.     if (debug) {
  282.         fprintf(stderr, "\nbuf contains: ->%s<-\n", buf);
  283.         fprintf(stderr, "leaving sm24read()\n-----------\n");
  284.         fflush(stderr);
  285.     }
  286. #endif
  287.     return 1;
  288. }
  289.  
  290.  
  291. STATIC
  292. accept(baudrate)
  293. int    baudrate;
  294. {
  295.     int i;
  296.  
  297.     BR = baudrate;
  298.     if ((i = speed(baudrate)) != NULL)
  299.         ttysetup(i);
  300. }
  301.  
  302.  
  303. STATIC
  304. alarmtr()
  305. {
  306. #ifdef    DEBUG
  307.     if (debug)
  308.         fprintf(stderr, "alarm went off!\n");
  309. #endif
  310.     longjmp(jmpbuf, 1);
  311. }
  312.  
  313. STATIC int
  314. sm24set(tosend, buf, num, errmsg)
  315. char    *tosend, *buf, *num, *errmsg;
  316. {
  317.     sm24write(tosend);
  318.     sm24read(buf, CMD_DELAY, (u_int) (sizeof MDM_OK) - 1);
  319.     if (strncmp(buf, MDM_OK, (sizeof MDM_OK) - 1) != 0) {
  320.         printf(" %s modem %s\n", NAME, errmsg);
  321. #ifdef ACULOG
  322.         logent(value(HOST), num, NAME, errmsg);
  323. #endif
  324.         return 0;
  325.     }
  326.     return 1;
  327. }
  328.